/**
* \file		TabComp.h
* \brief	Définit la structure TabComp
* \details	C'est ici que sont définis la structure Comportement, ses
*		accesseurs, ses mutateurs et ses fonctions de manipulation.
*/

#ifndef TABCOMP_H
#define TABCOMP_H

#include "Comportement.h"

/**
* \brief	Structure comportant la table des Comportements
* \details	Cette structure contient un tableau de pointeurs sur
*		Comportement, répertoriant les Comportements possibles pour
*		les nains dans le jeu ; ainsi que le nombre de comportements
*		possibles (pour des facilités de manipulation). Ni les
*		pointeurs, ni le nombre de comportements répertoriés dans le
*		tableau ne seront amenés à changer une fois le tableau défini.
*/
typedef struct
{
   int nbComp;		/*!< Taille du tableau de Comportements : entier */
   Comportement **tab;	/*!< Tableau des Comportements : tableau de pointeurs
			sur Comportement */
} TabComp;


/*======================== Gestion de la mémoire =======================*/
/**
* \brief	Initialise une structure TabComp
* \details	Alloue la mémoire nécessaire au stockages des pointeurs, met
*		les pointeurs du tableau à NULL et l'entier la valeur donnée.
* \param	ptabComp	Pointeur vers le TabComp à initialiser
* \param	nb 		Nombre de cases du tableau
*/
void initTabComp(TabComp *ptabComp, int nb);

/**
* \brief	Crée le tableau des Comportements
* \details	Crée le tableau des Comportements et l'initialise grâce à
*		initTabComp.
* \param	ptabComp	Pointeur sur l'adresse du TabComp à créer
*/
void creerTabComp(TabComp **ptabComp, int nb);

/**
* \brief	Libère la mémoire allouée aux champs du tableau de
*		Comportements donné
* \details	Met à NULL le pointeur, désalloue la mémoire réservée
*		initialement pour le tableau, met à 0 l'entier
* \param	ptabComp		Pointeur vers le TabComp à libérer
*/
void libereTabComp(TabComp *ptabComp);

/**
* \brief	Libère la mémoire allouée à un TabComp donné
* \param	ptabComp		Pointeur vers le TabComp à détruire
*/
void detruireTabComp(TabComp *ptabComp);


/*============================= Accesseurs =============================*/

/**
* \brief	Retourne le nombre de comportements du tableau de Comportements
* \return	Un entier
* \param	ptabComp	Pointeur vers un TabComp
*/
int getNbCompTabComp(const TabComp *ptabComp);

/**
* \brief	Retourne le ième élément du tableau de Comportement
* \return	Un Comportement
* \param	ptabComp	Pointeur vers un TabComp
* \param	i		Entier, numéro de la case désirée
*/
Comportement *getIemeCompTabComp(const TabComp *ptabComp, int i);


/*============================== Mutateurs =============================*/

/**
* \brief	Remplace la valeur indiquant la taille du tableau des
*		Comportements par une valeur donnée
* \param	ptabComp	Pointeur vers un TabComp
* \param	nouvVal		Entier, nouvelle valeur
*/
void setNbCompTabComp(TabComp *ptabComp, int nouvVal);

/**
* \brief	Remplace le contenu de la Ième case du tableau de
*		comportements par le pointeur donné
* \param	ptabComp	Pointeur vers un TabComp
* \param	pcomp		Pointeur vers un Comportement
* \param	i		Entier
*/
void setIemeCompTabComp(TabComp *ptabComp, Comportement *pcomp, int i);


/*========================== Fonctions autres ==========================*/
/**
* \brief	Crée le tableau des Comportements tel qu'il sera utilisé dans
*		le jeu, en se basant sur les actions et en montant les listes
*		comportementales ; et renvoie un pointeur qui pointe dessus
* \return	Pointeur vers un TabComp
*/
TabComp *creerDonneeTabComp();

/**
* \brief	Renvoie le comportement dont on aura donné le nom en
*		paramètre. Si ce comportement n'existe pas, renvoie le premier
*		comportement du tableau (Inactif).
* \param	ptabComp	Pointeur vers un TabComp
* \param	nomComp		Nom du comportement recherché, chaîne de
*				caractères
*/
Comportement *rechercheCompNomTabComp(TabComp *ptabComp, char *nomComp);

/**
* \brief	Renvoie le comportement associé à la production dont on aura
*		donné le nom en paramètre. Si aucun comportement ne convient,
*		renvoie le comportement Inactif.
* \param	ptabComp	Pointeur vers un TabComp
* \param	nomProd		Nom de la production
*/
Comportement *rechercherCompNomProdTabComp(TabComp *ptabComp, char *nomProd);

/*========================== Fonction de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module TabComp
* \details	Teste les différentes fonctions du module TabComp en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testTabComp();

#endif
